const { getConnection } = require('../config/db');
const bcrypt = require('bcrypt');

class AdminModel {
  // 根据用户名查找管理员
  static async findByUsername(username) {
    const connection = await getConnection();
    try {
      const sql = 'SELECT * FROM admins WHERE username = ?';
      const result = await connection.execute(sql, [username]);
      
      // 处理不同的返回格式
      let rows = [];
      if (Array.isArray(result) && result.length > 0) {
        // 标准格式: [rows, fields]
        rows = result[0];
      } else if (result && result._rows) {
        // Execute 对象格式
        rows = result._rows;
      } else if (result && Array.isArray(result)) {
        // 直接返回结果数组
        rows = result;
      }
      
      // 返回第一行数据或 null
      return Array.isArray(rows) && rows.length > 0 ? rows[0] : null;
    } finally {
      connection.release();
    }
  }

  // 验证密码
  static async validatePassword(plainPassword, hashedPassword) {
    return await bcrypt.compare(plainPassword, hashedPassword);
  }

  // 创建管理员用户
  static async create(username, password) {
    const connection = await getConnection();
    try {
      // 对密码进行加密
      const hashedPassword = await bcrypt.hash(password, 10);
      
      const sql = 'INSERT IGNORE INTO admins (username, password) VALUES (?, ?)';
      const result = await connection.execute(sql, [username, hashedPassword]);
      
      // 处理不同的返回格式
      let insertId = null;
      if (Array.isArray(result) && result.length > 0) {
        // 标准格式: [rows, fields]
        insertId = result[0].insertId || null;
      } else if (result && result.insertId) {
        // 直接返回结果对象
        insertId = result.insertId;
      } else if (result && result._result) {
        // Execute 对象格式
        if (Array.isArray(result._result) && result._result.length > 0) {
          insertId = result._result[0].insertId || null;
        }
      }
      
      return {
        id: insertId,
        username
      };
    } finally {
      connection.release();
    }
  }

  // 更新管理员密码
  static async updatePassword(id, newPassword) {
    const connection = await getConnection();
    try {
      // 对新密码进行加密
      const hashedPassword = await bcrypt.hash(newPassword, 10);
      
      const sql = 'UPDATE admins SET password = ? WHERE id = ?';
      const result = await connection.execute(sql, [hashedPassword, id]);
      
      // 处理不同的返回格式
      if (Array.isArray(result) && result.length > 0) {
        // 标准格式: [rows, fields]
        return result[0];
      } else if (result) {
        // 直接返回结果对象
        return result;
      }
      return null;
    } finally {
      connection.release();
    }
  }
}

module.exports = AdminModel;